package 数据结构.栈和队列.study;

import java.util.Arrays;
import java.util.Stack;

//栈的实现：可以利用数组/链表
public class myStack {
    //数组
    private int arr[];
    //当前的元素个数
    private int size;
    public myStack(){
        //初始化数组的容量
        this(12);
    }
    public myStack(int max){
        //将这个栈的容量 赋值过来
        this.arr=new int[max];
    }
    //入栈
    public int push(int value){
        //先判断是否容量已经满了
        if(this.size==this.arr.length){
            //证明栈已经满了
            //扩容
            int newArr[];
           newArr = Arrays.copyOf(arr, 2 * arr.length);
           //重新定义arr
           arr=newArr;
        }
        //下面要进行进栈的操作，栈：先进后出，所以的话是添加在第一个？不用，对出栈做准备即可
        this.arr[size]=value;
        //长度加一
        this.size++;
        return value;
    }
    //出栈
    //不用指定删除哪一个，删除那个最晚进去的，即最后面的那个
    public int pop(){
        //判断栈是否为空，如果为空则返回0
        if(this.size==0){
            throw new RuntimeException("栈中没有元素,不能出栈....");
        }
        //如果不为0，则证明可以出栈
        //因为不是从1开始，所以索引=长度-1；
        int value=arr[size-1];
        //将长度-1，这样子下一个进栈的将会去覆盖这个元素
        this.size--;
        //返回被删除的值
        return value;
    }
    //获得栈顶元素
    public int peak(){
        if(this.size==0){
            throw new RuntimeException("栈中没有元素,不能出栈....");
        }
        //如果栈中有元素，则可以返回栈顶
        return arr[this.size-1];
    }
    //获取元素个数
    public int getSize(){
        return size;
    }
    //判断栈是否为空
    public  boolean isEmpty(){
        return size == 0;
    }
    public static void main(String[] args) {

    }
}
